package pimmodel;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * 
 * Testklasse PimDatenTest:<br>
 * JUnit Testklasse zur Klasse PimDaten.
 * 
 * @author Thomas Schoenfeld
 * @version (20120902_01)
 *
 */
public class PimDatenTest {

	IPimDaten pimDaten1;
	IPimDaten pimDaten2;
	IPimDaten pimDaten3;
	IPimDaten pimDaten4;
	
	@Before
	public void setUp() throws Exception {
		pimDaten1 = new PimDaten( "Schmidt" );
		pimDaten2 = new PimDaten( "Folz" );
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testPimDaten() {		
		assertEquals( ( new PimDaten() ).getName(), "" );
	}

	@Test
	public void testPimDatenString() {
		pimDaten3 = new PimDaten( "Schmidt" );
		assertFalse( pimDaten1 == null );
		assertFalse( pimDaten3 == null );
		assertEquals( pimDaten1.getName(), pimDaten3.getName() );
		assertEquals( pimDaten1, pimDaten3 );
		assertTrue( pimDaten1.hashCode() == pimDaten3.hashCode() );
		assertTrue( pimDaten1.equals( pimDaten3 ) );
		assertTrue( pimDaten1.compareTo( pimDaten3 ) == 0 );
	}

	@Test
	public void testPimDatenIPimDaten() {
		pimDaten3 = new PimDaten( pimDaten1 );
		assertFalse( pimDaten1 == null );
		assertFalse( pimDaten3 == null );
		assertFalse( pimDaten1 == pimDaten3 );
		assertEquals( pimDaten1.getName(), pimDaten3.getName() );
		assertEquals( pimDaten1, pimDaten3 );
		assertTrue( pimDaten1.hashCode() == pimDaten3.hashCode() );
		assertTrue( pimDaten1.equals( pimDaten3 ) );
		assertTrue( pimDaten1.compareTo( pimDaten3 ) == 0 );
	}

	@Test
	public void testGetName() {
		assertEquals( pimDaten1.getName(), "Schmidt" );
		assertEquals( pimDaten2.getName(), "Folz" );
		assertFalse( pimDaten1.getName().equals( "Denzer" ) );
		assertFalse( pimDaten2.getName().equals( "Huckert" ) );		
	}

	@Test
	public void testSetName() {
		assertEquals( pimDaten1.getName(), "Schmidt" );
		pimDaten1.setName("Huckert");
		assertEquals( pimDaten1.getName(), "Huckert" );
		
		try {
			pimDaten1.setName( null );
		}
		catch (IllegalArgumentException exptected) {}
		
		try {
			pimDaten1.setName( " " );
		}
		catch (IllegalArgumentException exptected) {}
		
		try {
			pimDaten3 = new PimDaten( " " );
		}
		catch (IllegalArgumentException exptected) {}						
	}

	@Test
	public void testToString() {
		String s = "PimDaten [Name = Schmidt]";
		assertEquals( pimDaten1.toString(), s );
	}
	
	@Test
	public void testHashCode() {
		pimDaten3 = new PimDaten( "Folz" );
		assertTrue( pimDaten2.hashCode() == pimDaten3.hashCode() );
		assertFalse( pimDaten1.hashCode() == pimDaten2.hashCode() );
	}

	@Test
	public void testEqualsObject() {
		pimDaten3 = new PimDaten( pimDaten1 );
		pimDaten4 = new PimDaten( "Schmidt" );
		
		// Reflexivitaet
		assertTrue( pimDaten1.equals( pimDaten1 ) );
		assertTrue( pimDaten2.equals( pimDaten2 ) );
		assertTrue( pimDaten3.equals( pimDaten3 ) );
		assertTrue( pimDaten4.equals( pimDaten4 ) );
		
		// Symmetrie
		assertTrue( pimDaten1.equals( pimDaten3 ) );
		assertTrue( pimDaten3.equals( pimDaten1 ) );
		assertTrue( pimDaten1.equals( pimDaten4 ) );
		assertTrue( pimDaten4.equals( pimDaten1 ) );
		assertTrue( pimDaten3.equals( pimDaten4 ) );
		assertTrue( pimDaten4.equals( pimDaten3 ) );
		assertFalse( pimDaten1.equals( pimDaten2 ) );
		assertFalse( pimDaten2.equals( pimDaten1 ) );
		assertFalse( pimDaten2.equals( pimDaten3 ) );
		assertFalse( pimDaten3.equals( pimDaten2 ) );
		assertFalse( pimDaten2.equals( pimDaten4 ) );
		assertFalse( pimDaten4.equals( pimDaten2 ) );
		
		// Transitivitaet
		assertTrue( pimDaten1.equals( pimDaten3 ) );
		assertTrue( pimDaten3.equals( pimDaten4 ) );
		assertTrue( pimDaten1.equals( pimDaten4 ) );		
	}

	@Test
	public void testCompareTo() {
		assertTrue( pimDaten1.compareTo( pimDaten2) > 0 );
		assertTrue( pimDaten2.compareTo( pimDaten1) < 0 );
		assertTrue( pimDaten1.compareTo( pimDaten1) == 0 );
		assertTrue( pimDaten2.compareTo( pimDaten2) == 0 );		
	}

}
